package com.hhf.cloud.service;

import io.seata.rm.tcc.api.BusinessActionContext;
import io.seata.rm.tcc.api.BusinessActionContextParameter;
import io.seata.rm.tcc.api.LocalTCC;
import io.seata.rm.tcc.api.TwoPhaseBusinessAction;
import org.apache.ibatis.annotations.Param;

/**
 * @author Daniel-黄海峰
 * @Description
 * @create 2024/3/2 22:00
 */
@LocalTCC
public interface AccountTccService {

    /**
     * @TwoPhaseBusinessAction就等于try预占资源 参数name必须跟service接口方法名一致
     * useTCCFence（默认不开启） 是seata1.5.1的新特性，主要用于解决TCC幂等，悬挂，空回滚问题，需增加日志表tcc_fence_log才能开启
     *           useTCCFence详细讲解文档地址：https://seata.apache.org/zh-cn/blog/seata-tcc-fence/
     *           这次TCC案例不开启useTCCFence
     * @param userId 用户id
     * @param money 扣多少钱
     */
    @TwoPhaseBusinessAction(name = "decreaseTcc", commitMethod = "confirm", rollbackMethod = "cancel",useTCCFence = false)
    void decreaseTcc(@BusinessActionContextParameter("userId") Long userId,
                     @BusinessActionContextParameter("money") Long money);

    /**
     *执行TCC事务时，成功就提交事务
     * @param ctx 上下文对象
     * @return 执行结果
     */
    Boolean confirm(BusinessActionContext ctx);

    /**
     * 执行TCC事务时，失败就回滚事务
     * @param ctx 上下文对象
     * @return 执行结果
     */
    Boolean cancel(BusinessActionContext ctx);


}
